/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;

import accesoDatos.Consultas;
import accesoDatos.ParametrosConsulta;
import com.sgd.videoclub.Estadistica;
import com.sgd.videoclub.Socio;
import com.sgd.videoclub.Videoclub;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.persistence.criteria.CriteriaBuilder;
import javax.servlet.ServletContext;
import javax.validation.constraints.AssertTrue;
import utils.FacesUtils;
import utils.FuncionesGenericas;
import utils.GeneraReporte;

/**
 *
 * @author Ing Daniel Silva
 */
@ManagedBean
@RequestScoped
public class CtrEstadistica {

    //Objetos y Listas:
    Estadistica estadistica = new Estadistica();
    List<Estadistica> lstEstadisticas = new ArrayList<>();
    List<Estadistica> lstEstadisticasMenu = new ArrayList<>();

    private int mesSeleccionado;

    //VideoClubs
    List<Videoclub> lstVideoClub = new ArrayList<>();
    List<SelectItem> lstItemsVideoClub = new ArrayList<>();

    //Variables Utilizadas:
    String txtBuscar = "";
    String opcionEdicion = "";
    String opcionBoton = "";

    //Librerias Herramientas
    Consultas consultas = new Consultas();
    FuncionesGenericas fg = new FuncionesGenericas();
    GeneraReporte gr = new GeneraReporte();

    //Sesiòn
    CtrSession ctrSession;

    //Constructor
    public CtrEstadistica() {
        //Cargo Sesiòn
        ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");

        //Refresco los datos de la ventana
        cargarDatos();

        //Carga Estadistica en caso que se edite
        cargarEstadistica();
    }

    public void cargarDatos() {
        //Inicializo valores:
        lstEstadisticas = consultas.getListHql(null, "Estadistica", " 0=0 order by codigo DESC  ", null);

        //cargoEstadisticasMenu();
        lstVideoClub = consultas.getListHql(null, "Videoclub", null, null);
        lstItemsVideoClub = fg.cargarSelectItems(lstVideoClub, "codigo");

    }

//    public void cargoEstadisticasMenu() {
//
//    //Lista de Estadisticas que Aparecen en el Menu:
//        List<ParametrosConsulta> lisPar = new ArrayList();
//        lisPar.add(new ParametrosConsulta("usuarioId", ctrSession.getUsuarioLogueado().getId()));
//
//        String sql = " SELECT DISTINCT emp.* "
//                + "    FROM USUARIO us,EMPRESA emp,PROYECTO proy,REQ_PARTICIPACION req "
//                + "    where "
//                + "    req.PROYECTO_ID=proy.ID and proy.EMPRESA_ID=emp.id and emp.USUARIO_ID=us.ID "
//                + "    and req.DESTINATARIO_ID=:usuarioId "
//                + "    and req.ESTADO='ACEPTADO' "
//                + "    and req.INMENU=1 "
//                + "    order by emp.abreviatura "
//                + " ";
//
//        lstEstadisticasMenu = consultas.getListSqlClass(sql, Estadistica.class, lisPar);
//
//        //Saco los proyectos de cada estadistica:
//        for (int n=0;n<lstEstadisticasMenu.size();n++) {
//
//            List<ParametrosConsulta> lisParProy = new ArrayList<ParametrosConsulta>();
//            lisParProy.add(new ParametrosConsulta("usuarioId", ctrSession.getUsuarioLogueado().getId()));
//            lisParProy.add(new ParametrosConsulta("estadisticaId", lstEstadisticasMenu.get(n).getId()));
//
//            sql = "  SELECT proy.* FROM USUARIO us,EMPRESA emp,PROYECTO proy,REQ_PARTICIPACION req "
//                    + "where "
//                    + "    req.PROYECTO_ID=proy.ID and proy.EMPRESA_ID=emp.id and emp.USUARIO_ID=us.ID "
//                    + "    and req.DESTINATARIO_ID=:usuarioId "
//                    + "    and req.ESTADO='ACEPTADO' "
//                    + "    and req.INMENU=1 "
//                    + "    and emp.id=:estadisticaId "
//                    + "    order by proy.abreviatura ";
//            List<Proyecto> listProyectosMenu = consultas.getListSqlClass(sql, Proyecto.class, lisParProy);
//            lstEstadisticasMenu.get(n).setProyectosMenu(listProyectosMenu);
//            
//        }
//
//    }
    public void cargarEstadistica() {
        //Cargo la Estadistica:

        if (!ctrSession.getParametro().isEmpty()) {

            for (Object parametro : ctrSession.getParametro()) {
                parametro.getClass();
                if (parametro.getClass() == estadistica.getClass()) {
                    opcionEdicion = "Editar";
                    estadistica = (Estadistica) parametro;

                }
            }

        } else {
            opcionEdicion = "Nuevo";

        }
    }

    //Opciones del Menu del Mantenimiento:
    public void seleccionaOpcion(String opcion) throws IOException {

        String url;
        boolean encontro = false;
        switch (opcion) {
            //Crear un Nuevo Registro
            case "N":
                ctrSession.getParametro().clear();
                ctrSession.setSelSocio(new Socio());
                ctrSession.getListSocios().clear();
                fg.redireccionar("frmEstadistica");
                break;
            //Editar el registro seleccionado
            case "E":

                //Cargo Entidad
                encontro = false;
                for (Estadistica estadistica : lstEstadisticas) {
                    if (estadistica.isSeleccionado()) {
                        this.estadistica = estadistica;
                        encontro = true;
                        break;
                    }
                }

                if (encontro) {

                    //Pongo los valores del Socio
                    ctrSession.setSelSocio(estadistica.getSocio());

                    //Guardo valor en la Session
                    ctrSession.getParametro().add(estadistica);
                    //Cargo Valores de la Entidad:
                    fg.redireccionar("frmEstadistica");
                }

                break;
            //Borrar el Registro seleccionado
            case "B":

                //Encuentro Entidad Seleccionada
                encontro = false;
                for (Estadistica estadistica : lstEstadisticas) {
                    if (estadistica.isSeleccionado()) {
                        this.estadistica = estadistica;
                        encontro = true;
                        break;
                    }
                }

                //Realizo la Eliminacion:
                consultas.eliminar(estadistica);
                cargarDatos();
                break;
        }

    }

    //Mètodo de Registro de Entidad
    public String grabar() {
        int opcion = 1;
        if (estadistica.getCodigo() != 0) {
            opcion = 0;
        } else {
            estadistica.setCodigo(Integer.valueOf(consultas.nextSecuencia("VIDEOCLUB.SEQ_ESTADISTICA.nextval").toString()));
        }

        estadistica.setSocio(ctrSession.getSelSocio());

        //Realizo la Validaciòn de la Entidad
        if (validacion(estadistica)) {

            //Cargo los valores de la entidad:
//            estadistica.setUsuario(ctrSession.getUsuarioLogueado());
            //Generar Total Gastado
            List listResp = consultas.getListSql("select sum(total_pagar) from alquiler where cod_socio=" + ctrSession.selSocio.getCodigo() + " and EXTRACT(MONTH FROM fecha_devolucion)=" + mesSeleccionado + " and EXTRACT(YEAR FROM fecha_devolucion)=EXTRACT(YEAR FROM SYSDATE)");
            String valorCalulado = null;
            if (listResp.size() > 0) {
                for (Object obj : listResp) {
                    if (obj != null) {
                        valorCalulado = obj.toString();
                    }
                }
            }

            if (valorCalulado == null) {
                valorCalulado = "0";
            }

            estadistica.setTotalGastado(BigDecimal.valueOf(Double.valueOf(valorCalulado.toString())));

            //Realizo el guardado:
            consultas.guardar(estadistica, opcion);
            fg.redireccionar("listEstadisticas");

        }
        return "";
    }

    public void cargarEstadisticaValor() {

        List listResp = consultas.getListSql("select sum(total_pagar) from alquiler where cod_socio=" + ctrSession.selSocio.getCodigo() + " and EXTRACT(MONTH FROM fecha_devolucion)=" + mesSeleccionado + " and EXTRACT(YEAR FROM fecha_devolucion)=EXTRACT(YEAR FROM SYSDATE)");
        String valorCalulado = null;
        if (listResp.size() > 0) {
            for (Object obj : listResp) {
                valorCalulado = obj.toString();
            }
        }

        if (valorCalulado != null) {
            estadistica.setTotalGastado(BigDecimal.valueOf(Double.valueOf(valorCalulado.toString())));

        }

    }

    public void verBuscar() {
        ctrSession.setVerBuscador(true);

    }

    public void cerrarBuscador() {
        ctrSession.setVerBuscador(false);

    }

    public void buscarSocio() {

        List listSocios = consultas.getListHql(null, "Socio", " nombre like '%" + ctrSession.getTxtbuscar().toUpperCase() + "%' order by nombre ", null);
        if (listSocios != null) {
            if (listSocios.size() == 1) {
                Socio socio = (Socio) listSocios.get(0);

                ctrSession.setSelSocio(socio);
                ctrSession.setTxtbuscar(String.valueOf(socio.getCodigo()));

            }
        }

        ctrSession.getListSocios().clear();
        ctrSession.getListSocios().addAll(listSocios);

    }

    //Metodo que realiza la validaciòn de la Entidad:
    public boolean validacion(Estadistica estadistica) {
        boolean exito = true;
        //Valido que los dos password sean los mismos

        //Si ya se creo esta estadistica no permitir
        List lista = consultas.getListSql("select * from estadistica where cod_socio=" + ctrSession.getSelSocio().getCodigo() + " and EXTRACT(MONTH FROM fecha_creacion)=" + mesSeleccionado + " and EXTRACT(YEAR FROM fecha_creacion)=EXTRACT(YEAR FROM SYSDATE)");
        if (lista != null) {
            if (lista.size() > 0) {
                exito = false;
                fg.mostrarError("La estadistica ya se ha generado para el mes y usuario seleccionado.");

            }
        }

        if (ctrSession.getSelSocio() == null) {

            exito = false;
            fg.mostrarError("Debe especificar un socio.");

        }

        if (ctrSession.getSelSocio() != null) {
            if (ctrSession.getSelSocio().getCodigo() == 0) {
                exito = false;
                fg.mostrarError("Debe especificar un socio.");
            }
        }

//        List lista=consultas.getListSql("select * from estadistica where nombre like '"+estadistica.getNombre().toUpperCase()+"' and cod_videoclub="+estadistica.getSel_VideoClub()+" ");
//        if(lista.size()>0){
//            exito=false;
//            fg.mostrarError("No se puede grabar. La película ya existe en este videoclub..");
//        }
        return exito;
    }

    //Metodo que realiza la busqueda de Objetos:
    public String buscar() {

        if (!txtBuscar.equals("")) {
            //Defino los campos por los que se realizarà la bùsqueda:
            String where = " upper(usuario.username) like '%" + txtBuscar.toUpperCase() + "%' or"
                    + " upper(nombre) like '%" + txtBuscar.toUpperCase() + "%' or"
                    + " upper(apellido) like '%" + txtBuscar.toUpperCase() + "%' ";
            lstEstadisticas = consultas.getListHql(null, "Estadistica", where, null);
        } else {
            listarEstadisticas();
        }
        return "";

    }

    public void mostrarEstadistica(ValueChangeEvent e) {
        int mes = Integer.valueOf(e.getNewValue().toString());
        mesSeleccionado = mes;
        cargarEstadisticaValor();
    }

    //Listado de Estadisticas
    public void listarEstadisticas() {
        lstEstadisticas = consultas.getListHql(null, "Estadistica", " 0=0 order by codigo DESC  ", null);
    }

    //Metodo que Redirecciona a la Pagina de Listados:
    public String irListado() {
        fg.redireccionar("listEstadisticas");
        return "";
    }

    //Metodo de Refrescamiento de Pagina:
    public String refrescar() {
        return "";
    }

    //Metodo que Realiza la Impresion de Listados
    public void imprimir() {
        gr.generaPdfListado(lstEstadisticas, "estadisticas", Estadistica.class, new HashMap(), "listaestadisticas");
    }

    //POJOS UTILIZADOS:
    public Estadistica getEstadistica() {
        return estadistica;
    }

    public void setEstadistica(Estadistica estadistica) {
        this.estadistica = estadistica;
    }

    public List<Estadistica> getLstEstadisticas() {
        return lstEstadisticas;
    }

    public void setLstEstadisticas(List<Estadistica> lstEstadisticas) {
        this.lstEstadisticas = lstEstadisticas;
    }

    public List<Estadistica> getLstEstadisticasMenu() {
        return lstEstadisticasMenu;
    }

    public void setLstEstadisticasMenu(List<Estadistica> lstEstadisticasMenu) {
        this.lstEstadisticasMenu = lstEstadisticasMenu;
    }

    public String getTxtBuscar() {
        return txtBuscar;
    }

    public void setTxtBuscar(String txtBuscar) {
        this.txtBuscar = txtBuscar;
    }

    public String getOpcionEdicion() {
        return opcionEdicion;
    }

    public void setOpcionEdicion(String opcionEdicion) {
        this.opcionEdicion = opcionEdicion;
    }

    public String getOpcionBoton() {

        if (opcionEdicion.startsWith("Nue")) {
            opcionBoton = "Crear";
        }
        if (opcionEdicion.startsWith("Edi")) {
            opcionBoton = "Actualizar";
        }

        return opcionBoton;
    }

    public void setOpcionBoton(String opcionBoton) {
        this.opcionBoton = opcionBoton;
    }

    public List<SelectItem> getLstItemsVideoClub() {
        return lstItemsVideoClub;
    }

    public void setLstItemsVideoClub(List<SelectItem> lstItemsVideoClub) {
        this.lstItemsVideoClub = lstItemsVideoClub;
    }

    public int getMesSeleccionado() {
        return mesSeleccionado;
    }

    public void setMesSeleccionado(int mesSeleccionado) {
        this.mesSeleccionado = mesSeleccionado;
    }

}
